package com.tosee.exception;

import java.util.Locale;

import com.tosee.utils.Constantes;
import com.tosee.utils.MessageHandler;

/**
 * Exception générique. Elle contient un code d'erreur.
 * 
 * @author ArnaudLev
 */
public abstract class GeneriqueException extends Exception {

    /**
     * UID pour la sérialisation
     */
    private static final long serialVersionUID = 1L;

    /**
     * Code de l'erreur
     */
    private Integer codeErreur;

    /**
     * Constructeur. Prend en paramètre le début de la clé du message d'erreur. Renseigne le message et le code d'erreur.
     * 
     * @param _locale localité
     * @param _cleMessage la clé du message associé à l'exception (sans le suffixe .code ou .msg)
     */
    public GeneriqueException(final Locale _locale, final String _cleMessage) {
        super(MessageHandler.getInstance().getMessage(_cleMessage + Constantes.CLE_MESSAGE_ERREUR, _locale));
        setCodeErreur(MessageHandler.getInstance().getIntegerMessage(_cleMessage + Constantes.CLE_CODE_ERREUR));
    }

    /**
     * Constructeur. Prend en paramètre le début de la clé du message d'erreur. Renseigne le message et le code d'erreur.
     * 
     * @param _locale localité
     * @param _cleMessage la clé du message associé à l'exception (sans le suffixe .code ou .msg)
     * @param _e cause de l'erreur
     */
    public GeneriqueException(final Locale _locale, final String _cleMessage, final Throwable _e) {
        super(MessageHandler.getInstance().getMessage(_cleMessage + Constantes.CLE_MESSAGE_ERREUR, _locale), _e);
        setCodeErreur(MessageHandler.getInstance().getIntegerMessage(_cleMessage + Constantes.CLE_CODE_ERREUR));
    }

    /**
     * Constructeur. Prend en paramètre le début de la clé du message d'erreur. Renseigne le message et le code d'erreur.
     * 
     * @param _locale localité
     * @param _cleMessage la clé du message associé à l'exception (sans le suffixe .code ou .msg)
     * @param _params les paramètres du message
     */
    public GeneriqueException(final Locale _locale, final String _cleMessage, final Object... _params) {
        super(MessageHandler.getInstance().getMessage(_cleMessage + Constantes.CLE_MESSAGE_ERREUR, _locale, _params));
        setCodeErreur(MessageHandler.getInstance().getIntegerMessage(_cleMessage + Constantes.CLE_CODE_ERREUR));
    }

    /**
     * Constructeur
     * 
     * @param _msg message de l'exception
     */
    public GeneriqueException(final String _msg) {
        super(_msg);
    }

    /**
     * Constructeur
     * 
     * @param _code code de l'exception
     * @param _msg message de l'exception
     */
    public GeneriqueException(final int _code, final String _msg) {
        super(_msg);
        setCodeErreur(_code);
    }

    /**
     * Constructeur par défaut
     */
    public GeneriqueException() {
        super();
    }

    /**
     * Constructeur.
     * 
     * @param _message message
     * @param _cause cause de la violation
     */
    public GeneriqueException(final String _message, final Throwable _cause) {
        super(_message, _cause);
    }

    /**
     * Constructeur.
     * 
     * @param _message message
     * @param _codeErreur code de l'erreur
     * @param _cause cause de la violation
     */
    public GeneriqueException(final String _message, final Integer _codeErreur, final Throwable _cause) {
        super(_message, _cause);
        this.codeErreur = _codeErreur;
    }

    /**
     * Constructeur.
     * 
     * @param _message message
     * @param _codeErreur code de l'erreur
     */
    public GeneriqueException(final String _message, final Integer _codeErreur) {
        super(_message);
        this.codeErreur = _codeErreur;
    }

    /**
     * @return the codeErreur
     */
    public final Integer getCodeErreur() {
        return codeErreur;
    }

    /**
     * @param _codeErreur the codeErreur to set
     */
    public final void setCodeErreur(final Integer _codeErreur) {
        this.codeErreur = _codeErreur;
    }
}
